﻿CREATE SCHEMA pca_socios;

CREATE TABLE pca_socios.tipos_cliente
(
	tipo_cliente_id integer NOT NULL,
	nombre varchar(50) NOT NULL,
	CONSTRAINT tipos_cliente_pk PRIMARY KEY(tipo_cliente_id)
);

INSERT INTO pca_socios.tipos_cliente VALUES(1,'Empresa'),(2,'Persona');

CREATE TABLE pca_socios.tipo_cliente_tipos_documentos_identidad
(
	tipo_cliente_id integer NOT NULL,
	tipo_documento_identidad_id varchar(5) NOT NULL,
	CONSTRAINT tipo_cliente_tipos_documentos_identidad_pk PRIMARY KEY(tipo_cliente_id,tipo_documento_identidad_id),
	CONSTRAINT tipos_cliente_fkey FOREIGN KEY(tipo_cliente_id)
		REFERENCES pca_socios.tipos_cliente(tipo_cliente_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT tipos_documentos_identidad_fkey FOREIGN KEY(tipo_documento_identidad_id)
		REFERENCES pca_tablas.tipos_documentos_identidad(codigo) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT
);

INSERT INTO pca_socios.tipo_cliente_tipos_documentos_identidad VALUES(1,'6');
INSERT INTO pca_socios.tipo_cliente_tipos_documentos_identidad VALUES(2,'0'),(2,'1'),(2,'4'),(2,'7');


CREATE OR REPLACE VIEW pca_socios.vw_tipo_cliente_tipos_documentos_identidad AS
SELECT
	tc.tipo_cliente_id,
	tc.tipo_documento_identidad_id,
	i.tabla_id,
	i.codigo,
	t.nombre,
	i.nombre_corto,
	i.caracteres_min,
	i.caracteres_max,
	i.activo
FROM
	pca_socios.tipo_cliente_tipos_documentos_identidad tc
INNER JOIN
	pca_tablas.tipos_documentos_identidad i
ON
	tc.tipo_documento_identidad_id = i.codigo
INNER JOIN
	pca_tablas.tablas_sunat t
ON
	i.tabla_id = t.tabla_id AND
	i.codigo = t.codigo;

CREATE OR REPLACE FUNCTION pca_socios.fn_validar_direccion_cliente(integer,--tipo_cliente_id $1
								   varchar --direccion $2
								   )RETURNS boolean AS
$$
BEGIN
	IF($1 = 1)THEN
		RETURN (NOT $2 IS NULL);
	ELSIF($1 = 2)THEN
		RETURN true; --Si es persona no importa si la direccion es null o no
	ELSE
		RETURN false; --Nunca deberia pasar 
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE SEQUENCE pca_socios.seq_cliente_id;
CREATE TABLE pca_socios.clientes
(
	empresa_id varchar(2) NOT NULL,
	oficina_id varchar(2) NOT NULL,
	cliente_id bigint NOT NULL DEFAULT pca_global.fn_pseudo_encrypt_bigint(nextval('pca_socios.seq_cliente_id')::integer),
	tipo_cliente_id integer NOT NULL,
	sesion_id bigint NOT NULL,
	tipo_documento_identidad_id varchar(5) NOT NULL,
	numero_documento_identidad varchar(50) NOT NULL,
	nombre varchar(250) NOT NULL,
	pais_id varchar(2) NOT NULL,
	direccion varchar(250),
	email varchar(100),
	fecha_registro timestamp with time zone NOT NULL DEFAULT now(),
	activo boolean NOT NULL DEFAULT true,
	eliminado boolean NOT NULL DEFAULT false,
	CONSTRAINT empresa_pk PRIMARY KEY (empresa_id,cliente_id),
	CONSTRAINT tipos_cliente_fkey FOREIGN KEY(tipo_cliente_id)
		REFERENCES pca_socios.tipos_cliente(tipo_cliente_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT sesiones_fkey FOREIGN KEY(empresa_id, oficina_id, sesion_id)
		REFERENCES pca_log.sesiones(empresa_id, oficina_id, sesion_id) MATCH FULL
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT tipos_documentos_identidad_fkey FOREIGN KEY(tipo_documento_identidad_id)
		REFERENCES pca_tablas.tipos_documentos_identidad(codigo) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT paises_fkey FOREIGN KEY(pais_id)
		REFERENCES pca_tablas.paises(pais_id) MATCH SIMPLE
		ON UPDATE CASCADE ON DELETE RESTRICT,
	CONSTRAINT cliente_unq UNIQUE(tipo_documento_identidad_id,numero_documento_identidad,pais_id),
	CONSTRAINT direccion_chk CHECK(pca_socios.fn_validar_direccion_cliente(tipo_cliente_id,direccion))
);

CREATE OR REPLACE VIEW pca_socios.vw_clientes AS
SELECT
	c.empresa_id,
	c.oficina_id,
	c.cliente_id,
	c.tipo_cliente_id,
	(SELECT nombre FROM pca_socios.tipos_cliente WHERE tipo_cliente_id=c.tipo_cliente_id)AS tipo_cliente,
	c.sesion_id,
	c.tipo_documento_identidad_id,
	(SELECT nombre_corto FROM pca_tablas.tipos_documentos_identidad WHERE codigo=c.tipo_documento_identidad_id)AS tipo_documento_identidad,
	c.numero_documento_identidad,
	c.nombre,
	c.pais_id,
	(SELECT nombre FROM pca_tablas.paises WHERE pais_id=c.pais_id)AS pais,
	c.direccion,
	c.email,
	c.fecha_registro,
	c.activo,
	c.eliminado
FROM
	pca_socios.clientes c;